home *** CD-ROM | disk | FTP | other *** search
/ Atari Forever 4 / Atari Forever 4 / Atari Forever 4.iso / SERIE_AI / AI_017 / INTERNET.TOS / SOFTWARE / DLINKSR / NICTST.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-09-10  |  7.3 KB  |  321 lines

  1. /********************************************************************/
  2. /*                                                                    */
  3. /*    Packet driver for D-LINK DE600 ethernet controller                */
  4. /*                                                                    */
  5. /*    Copyleft by P. Mayer, 1993 TU-Vienna IAEE                        */
  6. /*    All rights reserved                                                */
  7. /*                                                                    */
  8. /********************************************************************/
  9.  
  10. #define LOCKMEM  0x1
  11. #define LOCKALLO 0x2
  12. #define LOCKFREE 0x4
  13. #define LOCKMAIN 0x8
  14. #define LOCKRES  0x10
  15. #define LOCKREC  0x20
  16. #define LOCKNET  0x40
  17.  
  18. #include <stdio.h>
  19. #include <stddef.h>
  20. #include <string.h>
  21. #include <tos.h>
  22. #include <time.h>
  23. #include "nicmem.h"
  24. #include "nicdrv.h"
  25. #include "pktqueue.h"
  26. #include "pktdrv.h"
  27.  
  28. #define noDEBUG
  29. #define noDEBUGINTR
  30. #define noDEBUGPKT
  31. #define NORMAL
  32.  
  33. #define Bconws(x) dpy = x;while(*dpy)(Bconout(2,*dpy++))
  34.  
  35. char str[80];
  36. char *dpy;
  37.  
  38. extern long dclock(void);
  39.  
  40. PKTBUF PPKT[MAXPKT];
  41.  
  42. PKTPOOL PPOOL;
  43.  
  44. extern char nic_locked;
  45. extern procref old_intr;
  46.  
  47. int  retval;
  48. int     term = 0;
  49. int good = 0;
  50. et_hdr        header;
  51. int mode;
  52.  
  53. #define CENBUSY_vectornum 64
  54. #define SPUR_vectornum 24
  55.  
  56. void (*ihandler)(void) = NULL;
  57. extern void dlink_200interrupt(void);
  58. extern void dlink_interrupt(void);
  59. extern void vbl_loop(void);
  60. extern void nic_install(void);
  61. extern long *old200;
  62. extern long disablirq(void);
  63. extern long enablirq(void);
  64. extern long quitirq(void);
  65. int resetNIC(void);  /* reset dlink, init datastructures  */
  66.  
  67. PKTPOOL            *p_free;                  /* queue of free packets */
  68. u_short            freecnt;                  /* number of free packets */
  69.  
  70. PROTOCOL protos[MAXPROTOCOLS];  /* protocols to serve */
  71. int protocols = 0;              /* number of active protocols */
  72.  
  73. et_stat stat;                   /* statistics block */
  74.  
  75. #define NIC_BASE 0xfa0201L
  76.  
  77. typedef unsigned char byte;
  78.  
  79. byte CurTxPage, Mode_RxPg;
  80. int RxPktLen, RxStartAdd, TxStartAdd, CurRxPage, our_type;
  81. byte our_address[6];
  82. int last, LastTxStartAdd;
  83.  
  84. #define WRITE        (0x00 << 1)
  85. #define READ        (0x01 << 1)
  86. #define STATUS        (0x02 << 1)
  87. #define COMMAND        (0x03 << 1)
  88. #define NUL_CMD     (0x0c << 1)
  89. #define RX_LEN        (0x05 << 1)
  90. #define TX_ADR        (0x06 << 1)
  91. #define RW_ADR        (0x07 << 1)
  92.  
  93. #define WRITE_STROBE    (0x08 << 1)
  94.  
  95. #define RXEN        (0x08)
  96. #define TXEN        (0x04)
  97. #define LOOPBACK    (0x0c)
  98. #define RX_NONE        (0x00)
  99. #define RX_ALL        (0x01)
  100. #define RX_BP        (0x02)
  101. #define RX_MBP        (0x03)
  102.  
  103. #define RESET        (0x80)
  104. #define STOP_RESET    (0x00)
  105.  
  106. #define RXBUSY        0x80
  107. #define GOOD        0x40
  108. #define RESET_FLAG    0x20
  109. #define T16            0x10
  110. #define TXBUSY        0x08
  111.  
  112. #define BFRSIZ        2048
  113. #define RUNT        60
  114. #define EADDR_LEN    6
  115. #define HA13        0x20
  116. #define PAGE_0        0x00
  117. #define PAGE_1        0x08
  118. #define PAGE_2        0x10
  119. #define PAGE_3        0x18
  120.  
  121. static int ix;
  122. #define delay()    {ix = ix +9;} /* no delay needed for ST */
  123. #define pause()
  124. /* defines for access to DE600 */
  125.  
  126. #define WRITE_SUPER_FAST(value, cmd) \
  127.     x = *(byte*)(base + (int)((((((int)value) << 5) & 0x1e0)) + cmd)); \
  128.     x = *(byte*)(base + (int)((((((int)value) << 5) & 0x1e0)) + cmd)); \
  129.     delay(); \
  130.     x = *(byte*)(base + (int)((((((int)value) << 1) & 0x1e0) + ((cmd) ^ WRITE_STROBE)))); \
  131.     x = *(byte*)(base + (int)((((((int)value) << 1) & 0x1e0) + ((cmd) ^ WRITE_STROBE)))); \
  132.  
  133. #define WRITE_S_FAST(value, cmd) \
  134.     x = *(byte*)(base + (int)((((((int)value) << 5) & 0x1e0)) + cmd)); \
  135.     delay(); \
  136.     x = *(byte*)(base + (int)((((((int)value) << 1) & 0x1e0) + ((cmd) ^ WRITE_STROBE)))); \
  137.  
  138. #define READ_STAT \
  139.     x = *(byte*)(base + (int)STATUS); \
  140.     y = (*(byte*)(base + (int)NUL_CMD)/* & 0xf0*/)/* ^ 0x80*/; \
  141.  
  142. #define READ_STAT1 \
  143.     x = *(byte*)(base + (int)NUL_CMD); \
  144.     x = *(byte*)(base + (int)STATUS); \
  145.     x = *(byte*)(base + (int)STATUS); \
  146.     delay(); \
  147.     y = (*(byte*)(base + (int)NUL_CMD) /*& 0xf0*/) /*^ 0x80*/; \
  148.     y = (*(byte*)(base + (int)NUL_CMD) /*& 0xf0*/) /*^ 0x80*/; \
  149.  
  150. #define READ_STAT2 \
  151.     x = *(byte*)(base + (int)STATUS + 0x200); \
  152. /*    y = *(byte*)(base + (int)STATUS + 0x200); \*/
  153.  
  154. #define READ_SUB_FAST(cmd) \
  155.     x = *(byte*)(base + (int)(cmd)); \
  156.     delay(); \
  157.     x = (*(byte*)(base + (int)(cmd))) /*& 0xf0*/; \
  158. x >>= 4; \
  159.     y = *(byte*)(base + (int)(cmd + WRITE_STROBE)); \
  160.     delay(); \
  161.     y = (((*(byte*)(base + (cmd | WRITE_STROBE)) /*& 0xf0*/)) | x); \
  162. /*y ^= 0x88; */\
  163.  
  164. #define READ_FIRST(cmd) \
  165.     x = *(byte*)(base + (int)(cmd)); \
  166.     x = (((*(byte*)(base + (cmd | WRITE_STROBE)) /*& 0xf0*/))); \
  167. x >>= 4; \
  168.  
  169. #define READ_LOOP(cmd) \
  170.     y = (((*(byte*)(base + cmd) /*& 0xf0*/)) | x); \
  171. /*    y ^= 0x88;*/ \
  172.     x = (((*(byte*)(base + (cmd | WRITE_STROBE)) /*& 0xf0*/))); \
  173. x >>= 4; \
  174.  
  175. #define READ_LAST(cmd) \
  176.     y = (((*(byte*)(base + (cmd | WRITE_STROBE)) /*& 0xf0*/)) | x); \
  177. /*    y ^= 0x88; \*/
  178.  
  179. int rcv_pkt(void)
  180. {
  181. }
  182.  
  183. int rcv_check(void)
  184. {
  185. }
  186.  
  187. int copyEAD()
  188. {
  189.   register byte *base = (byte*)NIC_BASE;
  190.   register byte x,y;
  191.   int i;
  192.   
  193.   WRITE_SUPER_FAST(0,RW_ADR);
  194.   WRITE_SUPER_FAST(HA13,RW_ADR);
  195.   
  196.   for(i = 0; i < EADDR_LEN;i++) 
  197.   {
  198.     READ_SUB_FAST(READ);
  199.     our_address[i] = y;
  200.   }
  201.   if(   our_address[0] == 0x00 
  202.   && our_address[1] == 0xde 
  203.   && our_address[2] == 0x15)
  204.   {
  205.     our_address[1] = 0x80;
  206.     our_address[2] = 0xc8;
  207.     
  208.     /* our_address[3] &= 0x0f;
  209.     our_address[3] |= 0x70; */
  210.   }
  211.   else
  212.   {
  213.     printf("\nDE600 could not get ethernet address!!\n");
  214.     return -1;
  215.   }
  216.   
  217.   WRITE_SUPER_FAST(0,RW_ADR);
  218.   WRITE_SUPER_FAST(HA13,RW_ADR);
  219.   
  220.   for(i = 0;i < EADDR_LEN;i++) 
  221.   {
  222.     WRITE_SUPER_FAST(our_address[i],WRITE);
  223.   }
  224.   x++;
  225.   printf("\nDE600 ethernet address got.\n");
  226.   return 0;
  227. }
  228.  
  229. /***************************************************
  230. test for de600 ethernetadapter on cartridge port
  231. ***************************************************/
  232.  
  233. int Check_DE600()
  234. {
  235.   register byte *base = (byte*)NIC_BASE;
  236.   register byte x,y;
  237.   
  238.   x = *(byte*)(base + NUL_CMD);
  239.   x = *(byte*)(base + NUL_CMD);
  240.   delay();
  241.   WRITE_S_FAST(RESET,COMMAND);
  242.   delay();
  243.   WRITE_S_FAST(STOP_RESET,COMMAND);
  244.   delay();
  245.   READ_STAT1;
  246.   x++;     
  247.   if(y == 0)
  248.   {
  249.    printf("\nDE600 detected.\n");
  250.    return 0;
  251.   }
  252.   else
  253.   {
  254.     printf("\nDE600 not detected!! (status = %x)\n",y&0xff);
  255.     return -1;
  256.   }
  257. }
  258.  
  259. int test_mem()
  260. {
  261.   register byte *base = (byte*)NIC_BASE;
  262.   register byte x,y;
  263.   register int i;
  264.   
  265.   nic_locked |= LOCKMEM;
  266.   
  267.   WRITE_SUPER_FAST(0,RW_ADR);
  268.   WRITE_SUPER_FAST(0,RW_ADR);
  269.   for(i = 0;i < 0x800;i++)
  270.   {
  271.  /*   ix = *(byte*)(NIC_BASE+(i<<1));
  272.     ix = *(byte*)(NIC_BASE+(i<<1));
  273.     printf("%x - (%x)\n",i,ix);
  274.     Cconin();*/
  275.     WRITE_SUPER_FAST(i & 0xff,WRITE);
  276.   }
  277.   WRITE_SUPER_FAST(0,RW_ADR);
  278.   WRITE_SUPER_FAST(0,RW_ADR);
  279.   for(i=0;i<0x800;i++)
  280.   {
  281.     READ_SUB_FAST(READ);
  282.     if((i & 0xff) != y)
  283.     {
  284.       printf("\nDE600 memory test error!!(at %x=%x)\n",i,y&0xff);
  285.  /*     nic_locked &= ~LOCKMEM;
  286.       return -1;*/
  287.     }
  288.   }
  289.   x++;
  290.   nic_locked &= ~LOCKMEM;
  291.   printf("\nDE600 memory test ok.\n");
  292.   return 0;
  293. }
  294.  
  295. int resetNIC(void)
  296. {
  297.   int copyEAD(void);
  298.   int test_mem(void);
  299.   int Check_DE600(void);
  300.   
  301.   CurRxPage = 0x20;
  302.   Mode_RxPg = RX_BP | 0x20;
  303.   CurTxPage = 0;
  304.   
  305.   if(Check_DE600()) return -1;
  306.   if(test_mem()) return -2;
  307.   if(copyEAD()) return -3;
  308.   printf("\nDE600 test completed - no errors.\n");
  309.   return 0; 
  310. }
  311.  
  312. int main()
  313. {
  314.   
  315.   Cconws("\nTest V1.1b for Dlink DE600, fortec pm93 -\n");
  316.   Supexec(disablirq);
  317.   Supexec((long (*)())resetNIC);
  318.   return 0;
  319. }
  320.  
  321.